function createFunctions () {
  var result = new Array()
  // var i;
  for (var i = 0; i < 10; i ++) {
    result[i] = function () {
      return i
    }
  }
  return result
}
var resultFuc = createFunctions ()  //
// 因为创建的匿名函数没有执行，所以没有捕获到I,所以返回对象。由十个 function a { return i }组成的数组。


// 当你调用的时候，形成了闭包，（在一个函数内定义了另一个函数就形成了闭包），闭包具有外曾函数的作用域（变量对象），即for循环中的i.当你调用的时候，for循环执行完，i是10.所以打印出来的就是10
console.log(resultFuc[0]()) // 10



// 按期望打印
function createFunctions1 () {
  var result = new Array()
  for (var i = 0; i < 10; i++) {
    result[i] = function (num) {
      return function () {
        return num
      }
    }(i)
  }
  return result
}

var resultFunc1 = createFunctions1()
console.log(resultFunc1[1]()) // 1
// 上面这种的，可以按期望打印。因为创建的匿名函数立即执行，相当于捕获了for循环中的i
// 最后返回的Array是由function () {return 0} .....function () {return 10}组成的数组
// 调用的时候访问闭包。虽然for循环执行完了，但是每个匿名函数都捕获到了i






// 用let也能解决。因为上面的方式相当于用自我执行函数创建了一个局部作用域。更简单的创建作用域的方式是let.每次都会声明一个新的变量和一个新的作用域
function createFunctions2 () {
  var result = new Array
  for (let i = 0; i < 10; i++) {
    result[i] = function () {
      return i
    }
  }
  return result

}

var resultFunc2 = createFunctions2()
console.log(resultFunc2[1]()) // 1


// 闭包中的this
var name = 'The Window'
var object = {
  name: 'My Object',
  getNameFunc: function (a) {
    return function a(b) {
      return this.name
    }
  }
}
var na = object.getNameFunc()()
console.log(na) // The Window